
// 希望能够控制并发数量
class PromiseQueue {
    constructor(max) {
        this.taskList = [];
        this.max = max;
        // 当前执行数量
        this.count = 0
    }

    add(fn) {
        this.taskList.push(fn)
        this.run() // 这里很重要
    }

    run() {
        if (!this.taskList.length) {
            // 所有结束执行回调
            return
        }
        if (this.count >= this.max) {
            return
        }
        let fn = this.taskList.shift();
        let promise = fn()
        promise.then(this.done.bind(this)).catch(this.done.bind(this))
    }

    done() {
        this.count--;
        this.run()
    }

}



// 请实现以下的函数，可以批量请求数据，所有的URL地址在urls参数中，同时可以通过 max 参数控制请求的并发度，当所有请求结束之后，需要执行 callback 回调函数。发请求的函数可以直接使用 fetch 即可
function sendRequest(urls, max, callback) {
    let taskList = [];
    let count = 0;

    function add(fn) {
        taskList.push(fn)
        run()
    }

    function run() {
        if (!taskList.length) {
            // 所有结束执行回调
            callback && callback()
            return
        }
        if (count >= max) {
            return
        }
        let fn = taskList.shift();
        let promise = fn()
        promise.then(done.bind(this)).catch(done.bind(this))
    }

    function done() {
        count++
        this.run()
    }

    urls.forEach((url) => {
        add(() => { fetch(url) })
    })
}

